---
sidebar_position: 1
---

# Создание двухмерных динамических массивов

:::danger

Статья доделывается. Взята как есть из предыдущей версии методики.

:::

В динамической области памяти можно создавать двумерные массивы с помощью операции new или функции `mаllос`. Остановимся на первом варианте, поскольку он более безопасен и прост в использовании.

Обращение к элементам динамических массивов производится точно так же, как к элементам "обычных", с помощью конструкции вида $a[i][j]$.

Универсальный способ выделения памяти под двумерный массив, когда обе его размерности задаются на этапе выполнения программы, приведен ниже:

```cpp
int nrow, ncol;
cout << " Введите количество строк и столбцов :";
cin >> nrow >> ncol;
int **a = new int *[nrow]; // 1
for(int i = 0; i < nrow; i++) // 2
a[i] = new int [ncol];  // 3
```

Для того чтобы понять, отчего динамические массивы описываются именно так, нужно разобраться в механизме индексации элемента массива. Поскольку для доступа к элементу массива применяется две операции разадресации, то переменная, в которой хранится адрес начала массива, должна быть указателем на указатель.

В операторе `1` объявляется переменная типа "указатель на указатель на `int`" и выделяется память под массив указателей на строки массива (количество строк — `nrow`). В операторе `2` организуется цикл для выделения памяти под каждую строку массива. В операторе `3` каждому элементу массива указателей на строки присваивается адрес начала участка памяти, выделенного под строку двумерного массива. Каждая строка состоит из `ncol` элементов типа `int` (рис. 1).

Освобождение памяти из-под массива с любым количеством измерений выполняется с помощью операции `delete []`, например: `delete [] a`;

Рис. 1. Схема динамической области памяти, выделяемой под массивы
